package etagutil

import (
	"crypto/sha1"
	"encoding/hex"
	"fmt"
	"strings"
	"time"

	"gitee.com/xuyiping_admin/pkg/stringutil"
	"gitee.com/xuyiping_admin/pkg/xerr"
)

var version string

func init() {
	// NOTE: 简化使用，避免对外部环境依赖
	year, month, day := time.Now().Date()
	version = fmt.Sprintf("%d:%d:%d", year, month, day)
}

func GenerateETag(weak bool, keys ...string) string {
	if len(keys) == 0 {
		return ""
	}

	// NOTE: 增加一个版本概念，这样每次服务器启动，将会产生不同的 etag
	// 由于 Go 序列化模型不是稳定的，产生 ETAG 可能带来一些问题
	// 通过服务器启动，自动切换版本
	keys = append(keys, version)

	sha := sha1.New()
	if _, err := sha.Write(stringutil.StringToBytes(strings.Join(keys, "-"))); err != nil {
		panic(xerr.WithStack(err))
	}
	checksum := hex.EncodeToString(sha.Sum(nil))
	if weak {
		return fmt.Sprintf(`W/"%s"`, checksum)
	}
	return checksum
}

func SetEtagVersion(ver string) {
	version = ver
}
